package com.gqh.weather.domain.dto;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;

import java.util.List;

/**
 * 自定义分页结果类
 * 简化MyBatis Plus Page对象，只保留必要的分页信息
 * 
 * @param <T> 数据类型
 * @author AI
 * @date 2025-10-12
 */
@Data
public class MyPage<T> {

    /**
     * 当前页码（从1开始）
     */
    private Integer page;

    /**
     * 每页条数
     */
    private Integer count;

    /**
     * 总记录数
     */
    private Long total;

    /**
     * 当前页数据集合
     */
    private List<T> data;

    /**
     * 默认构造函数
     */
    public MyPage() {
    }

    /**
     * 构造函数
     *
     * @param page  当前页码
     * @param count 每页条数
     * @param total 总记录数
     * @param data  数据列表
     */
    public MyPage(Integer page, Integer count, Long total, List<T> data) {
        this.page = page;
        this.count = count;
        this.total = total;
        this.data = data;
    }

    /**
     * 从MyBatis Plus Page对象转换为MyPage对象
     *
     * @param mybatisPlusPage MyBatis Plus分页对象
     * @param <T>            数据类型
     * @return MyPage对象
     */
    public static <T> MyPage<T> fromMybatisPlusPage(Page<T> mybatisPlusPage) {
        if (mybatisPlusPage == null) {
            return new MyPage<>(1, 10, 0L, List.of());
        }

        return new MyPage<>(
                Math.toIntExact(mybatisPlusPage.getCurrent()), // Long转Integer
                Math.toIntExact(mybatisPlusPage.getSize()),    // Long转Integer
                mybatisPlusPage.getTotal(),                    // 保持Long类型
                mybatisPlusPage.getRecords()                   // 数据列表
        );
    }

    /**
     * 创建空的分页结果
     *
     * @param page  页码
     * @param count 每页条数
     * @param <T>   数据类型
     * @return 空的MyPage对象
     */
    public static <T> MyPage<T> empty(Integer page, Integer count) {
        return new MyPage<>(page, count, 0L, List.of());
    }

    /**
     * 获取总页数
     *
     * @return 总页数
     */
    public Integer getTotalPages() {
        if (total == null || count == null || count <= 0) {
            return 0;
        }
        return (int) Math.ceil((double) total / count);
    }

    /**
     * 是否有下一页
     *
     * @return true:有下一页, false:没有下一页
     */
    public boolean hasNext() {
        return page != null && page < getTotalPages();
    }

    /**
     * 是否有上一页
     *
     * @return true:有上一页, false:没有上一页
     */
    public boolean hasPrevious() {
        return page != null && page > 1;
    }
}